package com.zelin.order.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zelin.dao.OrderDao;
import com.zelin.dao.OrderItemDao;
import com.zelin.dao.PayLogDao;
import com.zelin.entity.OrderEntity;
import com.zelin.entity.OrderItemEntity;
import com.zelin.entity.PayLogEntity;
import com.zelin.entity.group.Cart;
import com.zelin.order.service.OrderService;
import com.zelin.utils.IdWorker;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * ------------------------------
 * 功能：
 * 作者：WF
 * 微信：hbxfwf13590332912
 * 创建时间：2021/8/14-15:29
 * ------------------------------
 */
@Service
public class OrderServiceImpl   extends ServiceImpl<OrderDao, OrderEntity> implements OrderService {

    @Autowired
    private IdWorker idWorker;
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private OrderItemDao orderItemDao;
    @Autowired
    private PayLogDao payLogDao;

    /**
     * 功能: 从redis中得到登录车信息
     * 参数:
     * 返回值: java.util.List<com.zelin.entity.group.Cart>
     * 时间: 2021/8/14 15:35
     * @param name
     */
    @Override
    public List<Cart> getCartList(String name) {
        //1. 得到购物车列表的字符串
        String cartStr = redisTemplate.opsForValue().get(name);
        //2. 转换为List<Cart>对象并返回
        if(StringUtils.isNotBlank(cartStr)){
            return JSON.parseArray(cartStr,Cart.class);
        }
        return new ArrayList<>();
    }

    /**
     * 功能: 提交订单
     * 参数:
     * 返回值: void
     * 时间: 2021/8/14 16:44
     */
    @Transactional
    @Override
    public void add(OrderEntity order) {
        //1. 得到购物车列表的字符串
        String cartStr = redisTemplate.opsForValue().get(order.getUserId());
        //2. 转换为List<Cart>对象并返回
        List<Cart> cartList = null;
        if(StringUtils.isNotBlank(cartStr)){
             cartList = JSON.parseArray(cartStr,Cart.class);
        }
        //2.1 定义代表所有订单的总金额
        double total = 0;
        //2.2 定义代表订单号的字符串
        String orderIds = "";
        //3. 添加订单(一个购物车对应一个订单)
        for (Cart cart : cartList) {
            //3.1 定义订单对象
            OrderEntity orderEntity = new OrderEntity();
            //3.2 生成订单id主键
            long id = idWorker.nextId();
            //累加订单和
            orderIds += id + ",";
            orderEntity.setOrderId(id);
            //3.3 设置订单的其它相关属性
            orderEntity.setCreateTime(new Date());
            orderEntity.setPaymentType(order.getPaymentType());
            orderEntity.setReceiver(order.getReceiver());
            orderEntity.setReceiverAreaName(order.getReceiverAreaName());
            orderEntity.setReceiverMobile(order.getReceiverMobile());
            orderEntity.setSellerId(cart.getSellerId());
            orderEntity.setUserId(order.getUserId());
            orderEntity.setSourceType(order.getSourceType());
            orderEntity.setStatus("1");     //未支付
            double sum = 0; //定义订单的总金额
            //3.4 得到购物车的购物项数据，向订单项表中添加此数据
            for (OrderItemEntity item : cart.getOrderItemList()) {
                //3.4.1 计算小计
                BigDecimal totalFee = new BigDecimal(item.getNum() * item.getPrice().doubleValue());
                item.setTotalFee(totalFee);
                //3.4.2 累加总金额
                sum += totalFee.doubleValue();
                //3.4.3 设置订单的id
                item.setOrderId(id);
                //3.4.4 设置订单项的id
                item.setId(idWorker.nextId());
                //3.4.5 设置商家id
                item.setSellerId(cart.getSellerId());
                //3.4.6 添加订单项到tb_ordeItem表
                orderItemDao.insert(item);
            }
            //3.5 计算此订单的总金额
            orderEntity.setPayment(new BigDecimal(sum));
            //3.6 添加订单
            this.save(orderEntity);
            //3.7 累加总金额
            total += sum;
        }

        //4. 保存支付日志到数据库
        if(order.getPaymentType().equals("1")){     //1：代表网上支付
          //4.1 定义支付日志
          PayLogEntity payLog = new PayLogEntity();
          payLog.setCreateTime(new Date());
          payLog.setPayType("2");       //代表支付宝
          payLog.setTradeState("0");    //代表未支付   0：未支付 1：己支付
          payLog.setUserId(order.getUserId());      //设置登录用户
          payLog.setOutTradeNo(idWorker.nextId());  //设置支付的订单号
          payLog.setTotalFee((long) (total)); //计算总金额
          payLog.setSubject("泽易购商城支付订单");
          payLog.setBody("一个良好的网上交易平台...");
          //4.2 去掉多余的订单id后的逗号
          orderIds = orderIds.substring(0, orderIds.length() - 1);
          //4.3 设置订单号
          payLog.setOrderList(orderIds);
          //4.4 添加支付日志到数据库中
          payLogDao.insert(payLog) ;

          //5. 保存到redis中一份（key：登录userid value：订单日志对象）
          redisTemplate.opsForValue().set(order.getUserId() + ":paylog",JSON.toJSONString(payLog),10, TimeUnit.DAYS);
        }

        //6. 清空redis中的购物车
        //todo...
    }

    /**
     * 功能: 根据登录用户得到订单及其订单项
     * 参数:
     * 返回值: java.util.List<com.zelin.entity.OrderEntity>
     * 时间: 2021/8/17 16:05
     */
    @Override
    public List<OrderEntity> findOrdersByUserId(String name) {
        List<OrderEntity> orderList = this.list(new QueryWrapper<OrderEntity>().eq("user_id", name));
        for (OrderEntity orderEntity : orderList) {
            //根据订单id查询订单项列表
            List<OrderItemEntity> itemEntities = orderItemDao.selectList(new QueryWrapper<OrderItemEntity>().eq("order_id", orderEntity.getOrderId()));
            //设置当前订单的订单项列表
            orderEntity.setOrderItemEntities(itemEntities);
        }
        return orderList;
    }
}
